﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PowerCalculation
{
    public partial class OutputForm : Form
    {
        private PowerCalculator _powerCalc;
        public OutputForm(PowerCalculator powerCalculator)
        {
            InitializeComponent();

            _powerCalc = powerCalculator;

            for (int electroIndex = 0; electroIndex < _powerCalc.GroupsCount; electroIndex++)
            {
                var groupNode = new TreeNode(electroIndex + 1 + "я группа");
                _powerCalc.ElectroDataList.Where(consumer => consumer.GroupId == electroIndex).ToList().ForEach(
                    consumer => groupNode.Nodes.Add(consumer.ConsumerDescription));

                OutputTree.Nodes.Add(groupNode);
            }

            //Примерное количество кабеля исходя из помещения
            //Суммарная потребляемая мощность
            //Потребляемая мощность освещением
            //Потребляемая мощность остальными элетроприборами
            //Потребители, имеющие регламентируемые параметры подключения
            //Подбор автоматов для каждой группы
            //Если ChangeSection = 1, то сечение провода необходимо изменить
            // Группы, количество, распределение, АВТОМАТ НА КАЖДУЮ ГРУППУ
            ReportRTBx.Clear();
            ReportRTBx.BulletIndent = 10;

            ReportRTBx.SelectionFont = new Font("Courier New", 12, FontStyle.Bold);
            ReportRTBx.SelectionAlignment = HorizontalAlignment.Center;
            ReportRTBx.SelectedText =
                "Отчет по результатам расчета внутреннего электроснабжения жилого помещения в многоквартирном доме \n\n";

            ReportRTBx.SelectionAlignment = HorizontalAlignment.Left;
            ReportRTBx.SelectionBullet = false;
            ReportRTBx.SelectionFont = new Font("Courier New", 10);

            ReportRTBx.SelectedText = "Примерное количество кабеля исходя из помещения:  ";
            ReportRTBx.SelectionFont = new Font("Courier New", 10, FontStyle.Bold);
            ReportRTBx.SelectedText = _powerCalc.CableLength.ToString() + " м\n";

            ReportRTBx.SelectionFont = new Font("Courier New", 10, FontStyle.Bold);
            ReportRTBx.SelectionBullet = false;
            ReportRTBx.SelectedText = "Потребители: \n";
            _powerCalc.ElectroDataList.ForEach(el =>
                                                   {
                                                       ReportRTBx.SelectionBullet = true;
                                                       ReportRTBx.SelectionFont = new Font("Courier New", 10);
                                                       ReportRTBx.
                                                           SelectedText
                                                           =
                                                           el.
                                                               ConsumerDescription + "  " + el.ConsumerPower.ToString() +
                                                           " кВт\n";
                                                   });
            ReportRTBx.SelectionFont = new Font("Courier New", 10);
            ReportRTBx.SelectionBullet = false;
            ReportRTBx.SelectedText = "Суммарная потребляемая мощность  ";
            ReportRTBx.SelectionFont = new Font("Courier New", 10, FontStyle.Bold);
            ReportRTBx.SelectedText = _powerCalc.TotalPower().ToString() + " кВт\n";
            ReportRTBx.SelectionFont = new Font("Courier New", 10);
            ReportRTBx.SelectedText = "Потребляемая мощность освещением  ";
            ReportRTBx.SelectionFont = new Font("Courier New", 10, FontStyle.Bold);
            ReportRTBx.SelectedText = _powerCalc.TotalLampsPower().ToString() + " кВт\n";
            ReportRTBx.SelectionFont = new Font("Courier New", 10);
            ReportRTBx.SelectedText = "Потребляемая мощность остальными элетроприборами  ";
            ReportRTBx.SelectionFont = new Font("Courier New", 10, FontStyle.Bold);
            ReportRTBx.SelectedText = _powerCalc.TotalElectricPower().ToString() + " кВт\n";
            if (_powerCalc.ElectroDataList.Where(el => el.ReglamentWireId != null).Count() != 0)
                // есть потребители с регламентируемыми параметрами подключения
            {

                ReportRTBx.SelectionFont = new Font("Courier New", 10, FontStyle.Bold);
                ReportRTBx.SelectionBullet = false;
                ReportRTBx.SelectedText = "Потребители, имеющие регламентируемые параметры подключения  \n";
                _powerCalc.ElectroDataList.Where(el => el.ReglamentWireId != null).ToList().ForEach(el =>
                                                                                                        {
                                                                                                            ReportRTBx.
                                                                                                                SelectionBullet
                                                                                                                = true;
                                                                                                            ReportRTBx.
                                                                                                                SelectionFont
                                                                                                                =
                                                                                                                new Font
                                                                                                                    ("Courier New",
                                                                                                                     10);
                                                                                                            ReportRTBx.
                                                                                                                SelectedText
                                                                                                                =
                                                                                                                el.
                                                                                                                    ConsumerDescription +
                                                                                                                "\n";
                                                                                                        });
            }
            if (_powerCalc.ChangeSection == 2)  // Данные провода не подходят
            {
                ReportRTBx.SelectionFont = new Font("Courier New", 10);
                ReportRTBx.SelectedText = "Некоторые приборы имеют слишком большую потребляемую мощность\n";
            }
            else
            {
                if (_powerCalc.ChangeSection == 1)
                {
                    ReportRTBx.SelectionFont = new Font("Courier New", 10);
                    ReportRTBx.SelectedText = "Сечение данного типа провода было изменено\n";
                    ReportRTBx.SelectionFont = new Font("Courier New", 10);
 
                    ReportRTBx.SelectedText = "Минимальное сечение провода для ввода\n";
                    ReportRTBx.SelectionFont = new Font("Courier New", 10);
                    ReportRTBx.SelectedText = _powerCalc.WireData.WireSection.ToString() + " мм\n";

                    ReportRTBx.SelectionFont = new Font("Courier New", 10);
                    ReportRTBx.SelectedText = "Количество жил в проводе:\n";
                    ReportRTBx.SelectionFont = new Font("Courier New", 10);
                    ReportRTBx.SelectedText = _powerCalc.WireData.WireCoreCount.ToString();
                }

                if (_powerCalc.GroupsCount != 1)
                {
                    ReportRTBx.SelectionFont = new Font("Courier New", 10, FontStyle.Bold);
                    ReportRTBx.SelectionBullet = false;
                    ReportRTBx.SelectedText = "\nГруппы электроприборов";
                    for (int electroIndex = 0; electroIndex < _powerCalc.GroupsCount; electroIndex++)
                    {
                        ReportRTBx.SelectionFont = new Font("Courier New", 10, FontStyle.Bold);
                        ReportRTBx.SelectionBullet = false;
                        ReportRTBx.SelectedText = "\n" + "Группа " + (electroIndex + 1).ToString();
                        _powerCalc.ElectroDataList.Where(consumer => consumer.GroupId == electroIndex).ToList().
                            ForEach(
                                consumer =>
                                    {
                                        ReportRTBx.SelectionFont = new Font("Courier New", 10);
                                        ReportRTBx.SelectionBullet = true;
                                        ReportRTBx.SelectedText = "\n" + consumer.ConsumerDescription;
                                    });
                        ReportRTBx.SelectionBullet = false;
                        var automat = _powerCalc.FindAutomatAmperage(electroIndex);
                        if (automat != null)
                        {
                            ReportRTBx.SelectedText = "\n" + "Автомат на " + automat + "А";
                        }
                        else ReportRTBx.SelectedText = "\n" + "Мощность, превышающая допустимую нагрузку автомата";
                    }
                }
                else
                {
                    ReportRTBx.SelectionFont = new Font("Courier New", 10);
                    ReportRTBx.SelectedText = "Необходимости разбития на группы нет";
                    ReportRTBx.SelectedText = "\n" + "Автомат на " + _powerCalc.FindAutomatAmperage(0) + "А";
                }
            }
        }

        string SaveFileReport()
        {
            ReportRTBx.SaveFile(System.Environment.GetFolderPath
                                    (System.Environment.SpecialFolder.Personal)
                                + @"\Report.rtf",
                                RichTextBoxStreamType.RichNoOleObjs);
           return System.Environment.GetFolderPath
                (System.Environment.SpecialFolder.Personal)
            + @"\Report.rtf";
        }

        private int checkPrint;
        private void PageSetupBtn_Click(object sender, System.EventArgs e)
        {
            pageSetupDialog1.ShowDialog();
        }

        private void PreviewPrintBtn_Click(object sender, System.EventArgs e)
        {
            printPreviewDialog1.ShowDialog();
        }

        private void PrintBtn_Click(object sender, System.EventArgs e)
        {
            if (printDialog1.ShowDialog() == DialogResult.OK)
                printDocument1.Print();
        }

        private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
        {
            checkPrint = 0;
        }

        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            // Print the content of RichTextBox. Store the last character printed.
            checkPrint = ReportRTBx.Print(checkPrint, ReportRTBx.TextLength, e);

            // Check for more pages
            if (checkPrint < ReportRTBx.TextLength)
                e.HasMorePages = true;
            else
                e.HasMorePages = false;
        }

        private void SaveFileBtn_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Сохранено в " + SaveFileReport());
        }

    }
}
